//package org.csu.softwaremetrics_demo.metric.ck.diagram;
//
//import org.csu.softwaremetrics_demo.entity.*;
//import org.csu.softwaremetrics_demo.entity.domain.*;
//import org.dom4j.Document;
//import org.dom4j.DocumentException;
//import org.dom4j.Element;
//import org.dom4j.io.SAXReader;
//
//import java.net.URL;
//import java.util.*;
//
///**
// * XML类图度量计算类
// * 负责解析XML格式的UML类图，计算各种度量指标
// * 主要度量指标包括：
// * - WMC (Weighted Methods per Class) 类的加权方法数
// * - DIT (Depth of Inheritance Tree) 继承树深度
// * - NOC (Number of Children) 子类数量
// * - CBO (Coupling Between Objects) 对象之间的耦合度
// */
//public class MetricCompute {
//
//    private final Map<String, XMLElement> clazzMap = new HashMap<>();
//    private final Map<String, Relation> relationshipMap = new HashMap<>();
//
//    /**
//     * 分析XML格式的UML类图并计算度量指标
//     * 处理步骤：
//     * 1. 解析XML文档
//     * 2. 提取类信息
//     * 3. 提取类之间的关系
//     * 4. 计算各项度量指标
//     * @param url XML文件的URL
//     * @return 包含度量结果的类元素列表
//     * @throws DocumentException XML解析异常
//     */
//    public List<XMLElement> metricAnalyze(URL url) throws DocumentException {
//        SAXReader reader = new SAXReader();
//        Document document = reader.read(url);
//
//        findClasses(document);
//        findRelationships(document);
//
////        计算加权方法数量
//        computeWmc();
////        计算继承树的深度
//        computeDit();
////        计算直接子类数量
//        computeNoc();
////        计算耦合度
//        computeCbo();
//        return new ArrayList<>(clazzMap.values());
//    }
//
//    /**
//     * 计算加权方法数量(WMC)
//     * WMC是类中所有方法的复杂度总和
//     * 在此实现中，简化为方法的数量
//     */
//    private void computeWmc() {
//        clazzMap.forEach((key, clazz) -> clazz.setWmc(clazz.getOperations().size()));
//    }
//
//    /**
//     * 计算继承树深度(DIT)
//     * DIT是从类到继承层次结构根的最长路径上的节点数
//     * 表示类继承层次的深度
//     */
//    private void computeDit() {
//        clazzMap.forEach((key, clazz) -> {
//            int count = 0;
//            XMLElement father = clazz.getFather();
//            while (father != null) {
//                count++;
//                father = father.getFather();
//            }
//            clazz.setDit(count);
//        });
//    }
//
//    /**
//     * 计算子类数量(NOC)
//     * NOC是直接继承自该类的子类数量
//     */
//    private void computeNoc() {
//        clazzMap.forEach((key, clazz) -> clazz.setNoc(clazz.getChildren().size()));
//    }
//
//    /**
//     * 计算对象之间的耦合度(CBO)
//     * CBO是一个类与其他类之间非继承关系的数量
//     * 包括关联、聚合、组合和依赖关系
//     */
//    private void computeCbo() {
////        耦合就是计算非继承的关系总数量
//        relationshipMap.forEach((key, relationship) -> {
//            if (relationship.getType() != Relation.Type.GENERALIZATION) {
//                int cbo = relationship.getElement_1().getCbo();
//                relationship.getElement_1().setCbo(cbo + 1);
//
//                cbo = relationship.getElement_2().getCbo();
//                relationship.getElement_2().setCbo(cbo + 1);
//            }
//        });
//    }
//
////    查询类的总数量
//    /**
//     * 从XML文档中提取类信息
//     * 包括类的属性和方法
//     * @param document XML文档对象
//     */
//    private void findClasses(Document document) {
//        Element rootElement = document.getRootElement();
//        Element classesElement = rootElement.element("Classes");
//        List<Element> classElementList = classesElement.elements();
//        for (Element element : classElementList) {
//            XMLElement clazz = new XMLElement();
//            clazz.setId(element.attributeValue("Id"));
//            clazz.setName(element.elementText("Name"));
//
//            Set<XMLBean> attributes = clazz.getAttributes();
//            List<Element> attributeList = element.element("Attributes").elements();
//            for (Element attributeElement: attributeList) {
//                XMLBean attribute = new XMLBean();
//                attribute.setId(attributeElement.attributeValue("Id"));
//                attribute.setName(attributeElement.elementText("Name"));
//                attribute.setDataType(attributeElement.elementText("DataType"));
//                attribute.setVisibility(attributeElement.elementText("Attribute.Visibility"));
//                attributes.add(attribute);
//            }
//
//            Set<Operation> operations = clazz.getOperations();
//            List<Element> operationList = element.element("Operations").elements();
//            for (Element operationElement: operationList) {
//                Operation operation = new Operation();
//                operation.setId(operationElement.attributeValue("Id"));
//                operation.setName(operationElement.elementText("Name"));
//                operation.setReturnType(operationElement.elementText("ReturnType"));
//                operations.add(operation);
//            }
//
//            clazzMap.put(clazz.getId(), clazz);
//        }
//    }
//
////    查询关系总数量
//    /**
//     * 从XML文档中提取类之间的关系
//     * 处理五种关系类型：
//     * - 继承关系(Generalization)
//     * - 关联关系(Association)
//     * - 聚合关系(Aggregation)
//     * - 组合关系(Composition)
//     * - 依赖关系(Dependency)
//     * @param document XML文档对象
//     */
//    private void findRelationships(Document document) {
//        Element rootElement = document.getRootElement();
//
//        Map<String, Relation.Type> typeMap = new HashMap<>();
//        typeMap.put("Generalizations", Relation.Type.GENERALIZATION);
//        typeMap.put("Associations", Relation.Type.ASSOCIATION);
//        typeMap.put("Aggregations", Relation.Type.AGGREGATION);
//        typeMap.put("Compositions", Relation.Type.COMPOSITION);
//        typeMap.put("Dependencies", Relation.Type.DEPENDENCY);
//
//        typeMap.forEach((key, type) -> {
//            Element relationshipsElement = rootElement.element(key);
//            if (relationshipsElement != null) {
//                List<Element> relationshipList = relationshipsElement.elements();
//                for (Element element: relationshipList) {
//                    Relation relationship = new Relation();
//                    relationship.setId(element.attributeValue("Id"));
//                    relationship.setType(type);
//
//                    XMLElement clazz1 = clazzMap.get(element.element("Object1").element("Class").attributeValue("Ref"));
//                    XMLElement clazz2 = clazzMap.get(element.element("Object2").element("Class").attributeValue("Ref"));
//
//                    if (type == Relation.Type.GENERALIZATION) {
//                        clazz2.setFather(clazz1);
//                        clazz1.getChildren().add(clazz2);
//                    }
//
//                    relationship.setElement_1(clazz1);
//                    relationship.setElement_2(clazz2);
//                    relationshipMap.put(relationship.getId(), relationship);
//                }
//            }
//        });
//    }
//}
